"""
该模块 定义 该应用 对应的 模型 相关的 序列化器 类

    在 序列化器 中， 对于 多对一 的映射关系 ， 默认序列化后 显示的是 它的 ID 值

"""
from rest_framework import serializers
from .models import User, Clazz
from datetime import datetime, timedelta


class ClazzSerializer(serializers.ModelSerializer):

    # 添加一个 方法属性 、毕业时间
    graduate_time = serializers.SerializerMethodField(method_name="get_graduate_time")

    def get_graduate_time(self, obj):
        # 录入时间 + 时长
        start: datetime = obj.create_time
        return start.date() + timedelta(days=obj.duration * 30)

    class Meta:
        model = Clazz
        fields = '__all__'


class UserSerializer(serializers.ModelSerializer):
    """应用于用户查询结果的序列化"""
    # clazz_name = serializers.ReadOnlyField(source="clazz.name")
    clazz = ClazzSerializer(read_only=True)

    class Meta:
        # 关联 模型类
        model = User
        # 配置要序列化的属性 ，可以配置一个列表 , 也可以设置为 __all__ （代表全部字段）
        # fields = ["id", "username", "first_name", "last_name", "email"]
        # fields = "__all__"
        exclude = ['password', 'groups', 'user_permissions']


class UserFormSerializer(serializers.ModelSerializer):
    """添加/修改"""

    # 默认 用户名是必传的，可以在序列化器中 覆盖掉模型的用户名设置！
    username = serializers.CharField(required=False)

    class Meta:
        model = User
        fields = "__all__"

    def create(self, validated_data):
        """validated_data : 校验成功后的表单数据、是一个字典"""
        validated_data.pop('groups', None)
        validated_data.pop('user_permissions', None)

        if not validated_data['is_staff']:
            validated_data["is_active"] = False
            # 发送激活邮件

        return self.Meta.model.objects.create_user(**validated_data)

    def update(self, instance, validated_data):
        password = validated_data.pop('password', None)
        # 设置密码
        if password is not None:
            instance.set_password(password)

        return super().update(instance, validated_data)


class ClazzAndUsersSerializer(serializers.ModelSerializer):
    users = UserSerializer(read_only=True, many=True)

    class Meta:
        model = Clazz
        fields = '__all__'
